package data

import (
	"encoding/json"
	"fmt"
	"land/config"
	"log"
	"net/http"
	"os"
	"os/exec"
	"path/filepath"
	"strconv"
	// "strings"
	// "time"
	// "github.com/jung-kurt/gofpdf"
)

// ImageAnalysisHandler is the handler function for image analysis
/*数据分析处理函数
* 流程：
	1、“w”更改配置文件，在配置文件里包含用户的id，用来指明用户文件夹。
	2、用命令行运行python脚本文件，将用户上传的图片转化为健康报告PDF文件。
	3、timewait，等待python脚本运行完毕。
	4、读取PDF文件，并将其发送给用户（前端页面）。
*/
func ImageAnalysisHandler(w http.ResponseWriter, r *http.Request) {
	// 跨域处理
	config.AllowCors(w)

	// 解析表单数据
	if err := r.ParseMultipartForm(10 << 20); err != nil { // 设置最大上传文件大小为10MB
		http.Error(w, "无法解析表单", http.StatusBadRequest)
		log.Printf("解析表单数据时出错: %v", err)
		return
	}
	// log.Println("表单数据:", r.Form)

	useridStr := r.FormValue("uid")

	// 将userid字符串转换为整数
	userid, err := strconv.Atoi(useridStr)
	if err != nil {
		http.Error(w, "用户ID无效", http.StatusBadRequest)
		log.Printf("用户ID转换为整数时出错: %v", err)
		return
	}
	// log.Printf("用户ID: %d", userid)

	// 指定用户文件夹
	userFolder := filepath.Join("uploads", strconv.Itoa(int(userid)))

	// 检查用户文件夹是否存在，不存在则创建
	if _, err := os.Stat(userFolder); os.IsNotExist(err) {
		if err := os.MkdirAll(userFolder, os.ModePerm); err != nil {
			http.Error(w, "无法创建用户文件夹", http.StatusInternalServerError)
			return
		}
	}

	// 生成配置文件（TXT格式）
	configFilePath := filepath.Join(config.SaveFolderName, config.ConfigFileName)
	configContent := fmt.Sprintf("%d\n%s", userid, config.DatasetName)

	// 写文件，如果文件不存在则创建并写入用户id
	if err := os.WriteFile(configFilePath, []byte(configContent), 0644); err != nil {
		http.Error(w, "无法创建或更新配置文件", http.StatusInternalServerError)
		return
	}

	// 指定运行的 Python 脚本路径和参数（用户文件夹路径）
	cmd := exec.Command("python", config.PythonScriptPath)

	// 执行命令并等待其完成
	if err := cmd.Start(); err != nil {
		http.Error(w, "无法启动Python脚本", http.StatusInternalServerError)
		return
	}

	// 等待命令完成
	if err := cmd.Wait(); err != nil {
		http.Error(w, "Python脚本执行失败", http.StatusInternalServerError)
		return
	}

	// 设置响应头，发送 PDF 文件和用户信息给客户端
	w.Header().Set("Content-Type", "application/json")

	response := map[string]interface{}{
		"id":      userid,
		"message": "健康报告生成成功",
	}

	// 返回 JSON 响应（可以在前端接收此信息）
	jsonResponse, _ := json.Marshal(response)
	w.Write(jsonResponse)

	// // 检查生成的 result 文件夹和 PDF 是否存在
	// resultFolder := filepath.Join(userFolder, config.ResultFolderName)
	// if _, err := os.Stat(resultFolder); os.IsNotExist(err) {
	// 	http.Error(w, "未生成结果文件夹", http.StatusInternalServerError)
	// 	return
	// }
	// pdfOutputPath := filepath.Join(resultFolder, config.PdfOutputName)
	// if _, err := os.Stat(pdfOutputPath); os.IsNotExist(err) {
	// 	http.Error(w, "未生成PDF文件", http.StatusInternalServerError)
	// 	return
	// }

	// // 读取 TXT 文件并获取疾病信息
	// txtFilePath := filepath.Join(resultFolder, config.HealthDatasetName)
	// if _, err := os.Stat(txtFilePath); os.IsNotExist(err) {
	// 	http.Error(w, "未生成疾病数据文件", http.StatusInternalServerError)
	// 	return
	// }
	// data, err := os.ReadFile(txtFilePath)
	// if err != nil {
	// 	http.Error(w, "无法读取疾病数据", http.StatusInternalServerError)
	// 	return
	// }

	// // 假设读取的数据是一个用逗号分隔的字符串
	// diseaseProbabilities := string(data) // 假设数据形式为 "0.8,0.5,0.3,..."
	// // probabilityStrings := strings.Split(diseaseProbabilities, ",") // 按逗号分割数据
	// probabilityStrings := strings.Fields(diseaseProbabilities) // 使用 Fields 按空格分割数据
	// if len(probabilityStrings) != 14 {
	// 	http.Error(w, "疾病概率数据数量错误", http.StatusInternalServerError)
	// 	return
	// }

	// // 创建健康报告文件夹
	// healthReportFolder := filepath.Join(userFolder, config.HealthReportFolderName)
	// if err := os.MkdirAll(healthReportFolder, os.ModePerm); err != nil {
	// 	http.Error(w, "无法创建健康报告文件夹", http.StatusInternalServerError)
	// 	return
	// }

	// // 使用当前时间生成文件名
	// currentTime := time.Now()
	// timeFormatted := currentTime.Format("2006_01_02_15_04")
	// healthReportFileName := fmt.Sprintf("健康报告_%s.pdf", timeFormatted)
	// healthReportPath := filepath.Join(healthReportFolder, healthReportFileName)

	// // 使用 gopdf 库生成健康报告 PDF
	// pdf := gofpdf.New("P", "mm", "A4", "")
	// pdf.AddPage()
	// pdf.SetFont("Arial", "B", 16)
	// pdf.Cell(40, 10, fmt.Sprintf("用户ID: %d", getUser.ID))
	// pdf.Ln(20)

	// // 添加疾病信息
	// for i, probStr := range probabilityStrings {
	// 	probability, err := strconv.ParseFloat(probStr, 64)
	// 	if err != nil {
	// 		http.Error(w, "疾病概率数据解析错误", http.StatusInternalServerError)
	// 		return
	// 	}

	// 	// 计算疾病的存在与否（可以设置阈值，比如 0.5）
	// 	var diseaseStatus string
	// 	if probability > 0.5 {
	// 		diseaseStatus = "有"
	// 	} else {
	// 		diseaseStatus = "没有"
	// 	}

	// 	pdf.Cell(40, 10, fmt.Sprintf("%s: %s (概率: %.2f)", config.DiseaseNames[i], diseaseStatus, probability))
	// 	pdf.Ln(10)
	// }

	// // 添加生成的 result.pdf
	// if _, err := os.Stat(pdfOutputPath); err == nil { // 检查 result.pdf 是否存在
	// 	pdf.AddPage()
	// 	pdf.SetFont("Arial", "B", 16)
	// 	pdf.Cell(40, 10, "以下是生成的 PDF 文件内容：")
	// 	pdf.Ln(10)

	// 	// 在健康报告中包含 result.pdf 的引用
	// 	pdf.Cell(40, 10, fmt.Sprintf("PDF 文件: %s", pdfOutputPath))
	// 	pdf.Ln(20)
	// }

	// // 保存生成的健康报告 PDF 文件
	// if err := pdf.OutputFileAndClose(healthReportPath); err != nil {
	// 	http.Error(w, "无法生成健康报告PDF", http.StatusInternalServerError)
	// 	return
	// }
}
